package org.freedesktop.gstreamer.utils;

import android.os.Environment;

import java.io.Closeable;
import java.io.File;
import java.io.IOException;

/**
 * ****************************************************************
 * 文件名称: FileUtils
 * 作    者: Created by gyd
 * 创建时间: 2019/3/1 14:35
 * 文件描述: 文件管理
 * 注意事项:
 * 版权声明:
 * ****************************************************************
 */
public class FileUtil {
    /**
     * 获取应用专属内部存储文件(无需权限) /data/user/0/pacakge/files
     *
     * @param dirName  父文件名
     * @param fileName 子文件名
     */
    public static File getFile(String dirName, String fileName) {
        //父文件目录
        String dirPath = CommonUtil.getContext().getFilesDir() + File.separator + dirName;
        File dir = new File(dirPath);
        if (!dir.exists())
            dir.mkdirs();
        //子文件目录
        String filePath = dirPath + File.separator + fileName;
        return new File(filePath);
    }

    /**
     * 获取应用专属内部存储文件-缓存(无需权限) /data/user/0/pacakge/cache
     *
     * @param fileName 文件名
     */
    public static File getCacheFile(String fileName) {
        String filePath = CommonUtil.getContext().getCacheDir() + File.separator + fileName;
        return new File(filePath);
    }

    /**
     * 获取应用专属外部存储空间文件(无需权限) /storage/emulated/0/Android/data/packname/files
     * 并检查sd卡是否可用
     *
     * @param dirName  父文件名
     * @param fileName 子文件名
     */
    public static File getExternalFile(String dirName, String fileName) {
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//SD卡是否可用
            String filePath = CommonUtil.getContext().getExternalFilesDir(dirName) + File.separator + fileName;
            return new File(filePath);
        } else {
            return getFile(dirName, fileName);
        }
    }

    /**
     * 获取应用专属外部存储空间文件-缓存(无需权限) /storage/emulated/0/Android/data/packname/cache
     * 并检查sd卡是否可用
     *
     * @param fileName 子文件名
     */
    public static File getExternalCacheFile(String fileName) {
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//SD卡是否可用
            String filePath = CommonUtil.getContext().getExternalCacheDir() + File.separator + fileName;
            return new File(filePath);
        } else {
            return getCacheFile(fileName);
        }

    }

    /**
     * 获取外部存储空间根目录(API29后废弃) /storage/emulated/0/dirname/filename
     *
     * @param dirName  父文件名
     * @param fileName 子文件名
     */
    public static File getExternalRootFile(String dirName, String fileName) {
        //父文件目录
        String dirPath = Environment.getExternalStorageDirectory() + File.separator + dirName;
        File dir = new File(dirPath);
        if (!dir.exists())
            dir.mkdirs();
        //子文件目录
        String filePath = dirPath + File.separator + fileName;
        return new File(filePath);
    }

    /**
     * 删除文件
     *
     * @param path
     */
    public static void deleteFile(String path) {
        File file = new File(path);
        deleteFile(file);
    }

    /**
     * 删除文件
     *
     * @param file
     */
    public static void deleteFile(File file) {
        if (!file.exists()) {
            return;
        }
        if (file.isFile()) {
            file.delete();
        } else if (file.isDirectory()) {
            File files[] = file.listFiles();
            for (int i = 0; i < files.length; i++) {
                deleteFile(files[i]);
            }
        }
        file.delete();
    }

    /**
     * 根据url下载文件，存储到应用专属外部存储空间
     *
     * @param url 文件地址
     */
    public static File getFileFromUrl(String url) {
        String fileName = url.substring(url.lastIndexOf("/") + 1);//文件名 a.mp4
        //String fileStyle = fileName.substring(fileName.lastIndexOf(".") + 1);//文件类型 mp4
        return getExternalCacheFile(fileName);
    }

    public static void closeStream(Closeable closeable) {
        if (closeable != null) {
            try {
                closeable.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
